package com.eslag.test;


import com.eslag.rpc.api.ByeService;
import com.eslag.rpc.api.HelloObject;
import com.eslag.rpc.api.HelloService;
import com.eslag.rpc.loadbalancer.RoundRobinLoadBalancer;
import com.eslag.rpc.serializer.CommonSerializer;
import com.eslag.rpc.transport.RpcClientProxy;
import com.eslag.rpc.transport.socket.client.SocketClient;

/**
 * 测试用消费者（客户端）
 */
public class SocketTestClient {

    public static void main(String[] args) {
        SocketClient client = new SocketClient(CommonSerializer.KRYO_SERIALIZER, new RoundRobinLoadBalancer());
        // client.setSerializer(new KryoSerializer());
        RpcClientProxy proxy = new RpcClientProxy(client);
        // 由于在客户端这一侧我们没有接口的具体实现类，就无法直接生成实例对象
        // 我们通过动态代理创建一个代理对象，这里我们指定为HelloService，这样我们在客户端就得到一个HelloService对象，
        // 可以像本地方法一样调用远程方法
        HelloService helloService = proxy.getProxy(HelloService.class);
        HelloObject object = new HelloObject(14, "This is a message");
        // 当我们在代理对象上调用方法时，这个调用会被转发到InvocationHandler的invoke()方法，
        // 这个时候，RpcClientProxy中的invoke()方法就会被调用
        // invoke()：构造rpcRequest对象（方法名、参数类型、参数值），发送给server，然后接受返回值
        // invoke()的返回值又作为hello()方法的返回值返回个调用者

        //由动态代理可知，代理对象调用hello()实际会执行invoke()
        String res = helloService.hello(object);
        System.out.println(res);
        ByeService byeService = proxy.getProxy(ByeService.class);
        System.out.println(byeService.bye("Netty"));
    }

}